//
//  Man.m
//  07-内存管理
//
//  Created by LL.F on 16/7/12.
//  Copyright © 2016年 LL.F. All rights reserved.
//

#import "Man.h"

@implementation Man

/**
 *  MRC下的setter方法
 **/

// 用assign修饰的属性的setter方法
- (void)setNumber:(NSInteger)number
{
    _number = number;
}
// 用retain修饰的属性的setter方法
- (void)setName:(NSString *)name
{
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}
// 用copy修饰的属性的setter方法
- (void)setMId:(NSString *)mId
{
    if (_mId != mId) {
        [_mId release];
        _mId = [mId copy];
    }
}
- (void)dealloc
{
    NSLog(@"对象已经释放");
    // 释放所有的属性生成的成员变量(语义使用retain, copy的需要释放)
    [_mId release];
    [_name release];
    [_sexual release];
    [_mDescription release];
    [_gayBoy release];

    [super dealloc];
}
// self. 与下划线的区别?????????????
// self.应用 = 左边
// 除了在等号左边的情况以外, 直接使用下划线

/**
 *   实现部分
 **/

// 实现协议方法在签订者的实现(.m)文件中
- (void)sayHello
{
    NSLog(@"hello");
}
// 实现copy协议
- (id)copyWithZone:(NSZone *)zone
{
    //开辟新的空间, 创建一个新的对象
    Man *man = [[Man allocWithZone:zone] init];
    // 浅拷贝, 只创建了新的对象, 但是所有的属性还指向原来的属性
    man.name = self.name;
    man.sexual = self.sexual;
    // 深拷贝, 不只创建新的对象, 所有的属性, 也对应的拷贝一份新的
    man.name = [self.name copy];
    man.sexual = [self.sexual copy];
    return  man;
    // 字符串对象签订了NSCopying协议, 所以可以用copy进行语义设置
}

// 赋值时用这个方法 在这个方法中 编写找不到key值得处理措施 防止产生野指针 所以跟赋值有关 使用self 而不是下划线
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    if ([key isEqualToString:@"id"]) {
        self.mId = value;
    }
    if ([key isEqualToString:@"desctiption"]) {
        self.mDescription = value;
    }
}
// 取值的时候调用这个方法
- (id)valueForUndefinedKey:(NSString *)key
{
    return nil;
}

@end
